package org.soderiakelvy.controller.sujeto;

import java.io.Serializable;
import java.util.List;

import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.soderiakelvy.controller.util.Constante;
import org.soderiakelvy.controller.util.Util;
import org.soderiakelvy.model.domain.ComercializacionMesVencidoVO;
import org.soderiakelvy.model.domain.ComercializacionPackVO;
import org.soderiakelvy.model.domain.ProductoVO;
import org.soderiakelvy.model.domain.SucursalFrioCalorVO;
import org.soderiakelvy.model.domain.SucursalProductoVO;
import org.soderiakelvy.model.domain.SucursalVO;
import org.soderiakelvy.model.domain.SujetoVO;
import org.soderiakelvy.model.domain.VisitaVO;
import org.soderiakelvy.model.service.RepartoServicio;
import org.soderiakelvy.model.service.SucursalServicio;
import org.soderiakelvy.model.service.SujetoServicio;
import org.soderiakelvy.model.service.imp.RepartoServicioImp;
import org.soderiakelvy.model.service.imp.SucursalServicioImp;
import org.soderiakelvy.model.service.imp.SujetoServicioImpl;

@ManagedBean
@ViewScoped
public class SujetoEmpresaEdit implements Serializable{
	private static final long serialVersionUID = -2758956548522412698L;
	//--- VO ---
	private SujetoVO sujeto;
	private SucursalVO sucursal;
	private VisitaVO visita;
	private ComercializacionPackVO comercializacionPack;
	private ComercializacionMesVencidoVO comercializacionMesVencido;
	//----------
	//--- SERVICE ---
	private SucursalServicio serviceSucursal;
	private SujetoServicio serviceSujeto;
	//---------------
	//--- List ---
	private String[] diasSeleccionados;
	private List<SucursalProductoVO> productosAsignados;
	private List<SucursalFrioCalorVO> equiposFrioCalorAsignados;
	private List<ComercializacionPackVO> comercializacionesPack;
	private List<ComercializacionMesVencidoVO> comercializacionesMesVencido;
	//------------
	//--- VARIABLES ---
	private String diasDeVisitaInString, datosDeContactos;
	
	private boolean isComercializacionPack;
	private boolean isComercializacionMesVencido;
	private boolean sinComercializacion = true;
	private boolean conComercializacion = false;
	//-----------------
	
	//-- CONSTRUCTOR ---
	public SujetoEmpresaEdit(){
		serviceSucursal = new SucursalServicioImp();
		serviceSujeto  = new SujetoServicioImpl(); 
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
		sucursal = (SucursalVO) sessionParams.get("sucursalUpdateCreate");
		if(sucursal != null){
			sujeto = sucursal.getSujeto();
			sucursal.setDomicilioCompleto(Util.getDireccion(sucursal));
			getVisitaBySucursal();
			getProductoBySucursal();
			getComercializacionBySucursal();
			datosDeContactos = Util.getDatosDeContacto(sucursal);
		}else System.out.println("Hubo un error en la vista sujetoEmpresaEdit.xhtml");
		fc.getExternalContext().getSessionMap().remove("sucursalUpdate");
	}

	public String actualizarSucursal(SucursalVO suc){
		if(sujeto.getTipoSujeto().equals(Constante.SUJETO_RESIDENCIAL)){
			serviceSujeto.updateSujetoVO(sujeto);
		}
		serviceSucursal.updateSucursal(suc);
		
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
		sessionParams.put("sujetoEmpresaAlta", sujeto);
		return "sujetoEmpresaCreate2.xhtml";
	}
	
	private void getVisitaBySucursal(){
		RepartoServicio r =  new RepartoServicioImp();
		visita = r.getVisitaBySucursal(sucursal);
		if(visita != null){
			visita.getSucursal().setDomicilioCompleto(Util.getDireccion(visita.getSucursal()));
			diasDeVisitaInString = Util.getDiasDeVisita(visita);
		}else {
			System.out.println("No tiene visita cargada");
		}
	}
	
	private void getProductoBySucursal(){
		SucursalServicio service = new SucursalServicioImp();
		productosAsignados = service.getProductosPorSucursal(getSucursal()); 		
	} 
	
	private void getComercializacionBySucursal(){
		SucursalServicio ss = new SucursalServicioImp();

		this.comercializacionesPack = ss.getComercializacionesPackBySucursal(getSucursal());
		if(comercializacionesPack != null && comercializacionesPack.size()>0){
			System.out.println("ComercializacionPack encontrada: "+ comercializacionesPack.size()	);
			switch (comercializacionesPack.size()) {
			case 1:
				comercializacionPack = comercializacionesPack.get(0);; 
				break;

			default:
				break;
			} 
			isComercializacionPack = true;
			isComercializacionMesVencido = false;
			
			conComercializacion = true;
			sinComercializacion = false;
		}else{
			this.comercializacionesMesVencido = ss.getProductosComercializadosAMesVencido(getSucursal());
			if(comercializacionesMesVencido != null && comercializacionesMesVencido.size()>0){
				isComercializacionPack = false;
				isComercializacionMesVencido = true;
				conComercializacion = true;
				sinComercializacion = false;
			}
		}
		if(conComercializacion && !sinComercializacion){
			getEquiposSucursalFrioCalorAsignados();
		}
	}
	
	private void getEquiposSucursalFrioCalorAsignados(){
		SucursalServicio ss = new SucursalServicioImp();
		equiposFrioCalorAsignados = ss.getSucursalFrioCalorBySucursal(getSucursal());
	}
	
	public String modificarDatosSucursal(){
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
		sessionParams.put("tipoCrudSucursal", Constante.SUCURSAL_UPDATE);
		sessionParams.put("sucursalCreate", sucursal);
		return "sujetoEmpresaSucursal.xhtml?faces-redirect=true";
	}
	
	
	public String modifcarRepartoVisita(){
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
		sessionParams.put("tipoCrudVisita", Constante.SUJETO_EMPRESA_VISITA_UPDATE);
		sessionParams.put("visitaUpdateCreate", visita);
		return "sujetoEmpresaVisita.xhtml?faces-redirect=true";
	}
	
	
	public String modificarProductos(){
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
		sessionParams.put("tipoCrudProducto", Constante.SUJETO_EMPRESA_PRODUCTO_UPDATE);
		sessionParams.put("sucursalUpdateCreate", getSucursal());
		return "sujetoEmpresaProducto.xhtml?faces-redirect=true";
	}
	
	public String modificarComercializacion(){
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
		if(isComercializacionPack && !isComercializacionMesVencido){
			sessionParams.put("tipoCrudComercializacionPack", Constante.SUJETO_EMPRESA_COMERCIALIZACION_PACK_UPDATE);
			sessionParams.put("sucursalUpdateComercializacionPack", getSucursal());
			return "sujetoEmpresaPack.xhtml?faces-redirect=true";
		}else {
			if(isComercializacionMesVencido && !isComercializacionPack){
				sessionParams.put("tipoCrudComercializacionMesVencido",Constante.SUJETO_EMPRESA_COMERCIALIZACION_MES_VENCIDO_UPDATE);
				sessionParams.put("sucursalUpdateComercializacioinMesVencido", getSucursal());
				return "sujetoEmpresaMesVencido.xhtml?faces-redirect=true";
			}
		}
		return null;
	}
	
	public String cancelarEdit(){
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
		sessionParams.put("sujeto", this.sujeto);
		return "sujetoEmpresaSucursalesList.xhtml?faces-redirect=true";
	}
	
	public String irComercializacionMesVencido(){
		System.out.println("Voy a comercializacion mes vencido");
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();		
		sessionParams.put("tipoCrudComercializacionMesVencido",Constante.SUJETO_EMPRESA_COMERCIALIZACION_MES_VENCIDO_CREATE);
		sessionParams.put("sucursalUpdateComercializacioinMesVencido",getSucursal());
		return "sujetoEmpresaMesVencido.xhtml?faces-redirect=true";
	}
	
	public String irComericaliazacionPack(){
		System.out.println("Voy a comercializacion pack ");	
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();		
		sessionParams.put("tipoCrudComercializacionPack",Constante.SUJETO_EMPRESA_COMERCIALIZACION_PACK_CREATE);
		sessionParams.put("sucursalUpdateComercializacionPack",getSucursal());
		return "sujetoEmpresaPack.xhtml?faces-redirect=true";
	}
	//--- Get and Set ---
	
	public SucursalVO getSucursal() {
		return sucursal;
	}
	
	public VisitaVO getVisita(){
		return visita;
	}

	public String[] getDiasSeleccionados() {
		return diasSeleccionados;
	}

	public List<SucursalProductoVO> getProductosAsignados() {
		return productosAsignados;
	}

	public void setDiasSeleccionados(String[] diasSeleccionados) {
		this.diasSeleccionados = diasSeleccionados;
	}

	public String getDiasDeVisitaInString() {
		return diasDeVisitaInString;
	}

	public ComercializacionPackVO getComercializacionPack() {
		return comercializacionPack;
	}

	public boolean getIsComercializacionPack() {
		return isComercializacionPack;
	}

	public boolean getIsComercializacionMesVencido() {
		return isComercializacionMesVencido;
	}

	public boolean getSinComercializacion() {
		return sinComercializacion;
	}

	public boolean getConComercializacion(){
		return conComercializacion;
	}
	
	public List<SucursalFrioCalorVO> getEquiposFrioCalorAsignados() {
		return equiposFrioCalorAsignados;
	}

	public List<ComercializacionPackVO> getComercializacionesPack() {
		return comercializacionesPack;
	}

	public String getDatosDeContactos() {
		return datosDeContactos;
	}
	
	public List<ComercializacionMesVencidoVO> getComercializacionesMesVencido(){
		return comercializacionesMesVencido;
	}
	
}
